#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
#define maxn 50001

int n,m;
vector<int> G[maxn];
vector<int> rG[maxn];
vector<int> seq;
bool used[maxn];
int sccid[maxn];
int csccidnum[maxn];
int deg[maxn];
int sccnum;

void add_edge(int from, int to){
	G[from].push_back(to);
	rG[to].push_back(from);
}

void dfs(int u){
	used[u]=true;
	for(int i=0; i<G[u].size(); i++){
		int v = G[u][i];
		if(!used[v]) dfs(v);
	}
	seq.push_back(u);
}

void rdfs(int u, int _sccid){
	used[u]=true;
	sccid[u]=_sccid;
	csccidnum[_sccid]++;
	for(int i=0; i<rG[u].size(); i++){
		int v = rG[u][i];
		if(!used[v]) rdfs(v,_sccid);
	}
}

int scc(){
	memset(used,0,sizeof(used));
	seq.clear();
	for(int u=1; u<=n; u++){
		if(!used[u]) dfs(u);
	}
	memset(used,0,sizeof(used));
	int _sccid = 0;
	for(int i=seq.size()-1; i>=0; i--){
		int v = seq[i];
		if(!used[v]){
			rdfs(v, _sccid);
			_sccid++;
		}
	}
	return _sccid;
}

int main(){
	cin>>n>>m;
	for(int i=0;i<m;i++){
		int u,v;
		cin>>u>>v;
		add_edge(u,v);
	}
	sccnum=scc();
	for(int u=1;u<=n;u++){
		for(int i=0;i<G[u].size();i++){
			int v=G[u][i];
			if(sccid[u]!=sccid[v]){
				deg[sccid[u]]++;
			}
		}
	}
	int zeronum=0;
	for(int i=0;i<sccnum;i++){
		if(deg[i]==0) zeronum++;
	}
	if(zeronum==0 || zeronum>=2) cout<<"0"<<endl;
	else{
		int maxnum=0;
		for(int i=0; i<sccnum; i++){
			if(deg[i]==0)
				maxnum=max(csccidnum[i],maxnum);
		}
		cout<<maxnum<<endl;
	}
	return 0;
}